use std::process::Command;
use crate::commands::vx::init::IS_VX;
use crate::commands::vx::run_vx::Return;

/// 检测微信是否正在运行
///
/// 该函数通过调用系统命令 `tasklist` 来判断名为 `Weixin.exe` 的进程是否存在。
/// 如果检测到进程名中包含 `weixin.exe`，则认为微信正在运行。
///
/// ### 执行逻辑
/// 1. 调用系统命令：`tasklist /FI "IMAGENAME eq Weixin.exe"`
/// 2. 获取命令输出（stdout）。
/// 3. 将输出内容转换为字符串，并转换为小写以便匹配。
/// 4. 判断输出中是否包含 `"weixin.exe"`。
///
/// ### 返回值
/// - `true`：检测到微信正在运行。
/// - `false`：未检测到微信或执行命令失败。
///
/// ### 注意事项
/// - 仅适用于 **Windows 系统**，因为使用了 `tasklist` 命令。
/// - 若运行环境不是 Windows，函数将始终返回 `false`。
///
/// ### 示例
/// ```rust
/// let running = is_running().await;
/// if running {
///     println!("微信正在运行");
/// } else {
///     println!("微信未运行");
/// }
/// ```
pub async fn is_running() -> bool {
    // 调用 Windows 的 tasklist 命令，过滤出 Weixin.exe 进程
    let output = Command::new("tasklist")
        .arg("/FI")
        .arg("IMAGENAME eq Weixin.exe")
        .output();

    // 处理命令执行结果
    match output {
        Ok(out) => {
            // 将标准输出转换为字符串并转为小写，方便匹配
            let stdout = String::from_utf8_lossy(&out.stdout).to_lowercase();
            // 判断输出中是否包含 weixin.exe 字样
            stdout.contains("weixin.exe")
        }
        // 命令执行失败时返回 false
        Err(_) => false,
    }
}

/// 获取微信运行状态（供前端调用）
///
/// 此函数作为 Tauri 的命令导出接口（使用 `#[tauri::command]` 标记），
/// 用于返回当前微信运行状态给前端 Vue 或其他客户端。
///
/// ### 执行逻辑
/// 1. 从全局变量 [`IS_VX`] 中读取当前微信运行状态。
/// 2. 如果 `running == true`，返回状态码 `201` 与消息 `"微信已打开!"`。
/// 3. 否则返回状态码 `204` 与消息 `"微信未打开!"`。
///
/// ### 返回值
/// - `Ok(Return)`：返回执行结果，包含状态码与消息内容。
/// - `Err(String)`：仅在内部调用异常时返回（当前逻辑不会触发）。
///
/// ### 状态码约定
/// | 状态码 | 含义 |
/// |--------|------|
/// | 201 | 微信已打开 |
/// | 204 | 微信未打开 |
///
/// ### 示例
/// ```rust
/// // 前端调用示例（Vue）
/// const res = await invoke("get_vx_running");
/// console.log(res.message);
/// ```
///
/// ```rust
/// // 后端调用示例（Rust）
/// let status = get_vx_running().await?;
/// println!("状态码: {}, 消息: {}", status.code, status.message);
/// ```
#[tauri::command]
pub async fn get_vx_running() -> Result<Return, String> {
    // 获取全局微信运行状态的读锁
    let is_vx = IS_VX.read().await;

    // 如果微信正在运行，则返回状态码 201
    if is_vx.running {
        return Ok(Return {
            code: 201,
            message: "微信已打开!".to_string(),
        });
    }

    // 否则返回状态码 204
    Ok(Return {
        code: 204,
        message: "微信未打开!".to_string(),
    })
}
